package com.manlook.cacciatesoromuseale;

import java.util.ArrayList;


import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;



public class Caccia {

	public String title;
	public ArrayList<Tappa> percorso;
	public Tappa stato;
	public long startTime;
	public long lastTappaStartTime=0;
	public double punteggio;
	public double punteggioTappa;
	public boolean primaPosizioneTrovata=false;
	public boolean aiutoDirezione=false;
	public boolean aiutoDistanza=false;
	public boolean aiutoIndizio=false;
	public boolean aiutoTime=false;
	public Long remTime;
	public boolean scaduto=false;
	
	public void setCacciadiprova() {
		primaPosizioneTrovata=false;
		title="Caccia al tesoro dei musei";
		percorso=new ArrayList<Tappa>();
		Tappa t1=new Tappa(0,"Museo Archeologico Nazionale","Vai al Museo Archeologico Nazionale","Si trova a Piazza Museo",null,null,40.853389,14.250617,100,1000);
		percorso.add(t1);
		t1.addAiuto("E' vicino alla fermata di mostra della linea1");
		t1.addAiuto("E' vicino a via toledo");
		Tappa t2=new Tappa(1,"Museo di Capodimonte","Vai al Museo di Capodimonte","E' in Largo San Martino (Vomero)",t1,null,40.867000,14.250311,200,1000);		
		percorso.add(t2);
		t2.addAiuto("E' nelle zone del Vomero");
		Tappa t3=new Tappa(2,"Museo di Palazzo Reale","Vai al Museo di Palazzo Reale","Si Trova in Piazza Plebiscito ",t2,null,40.836555,14.250430,300,1500);
		t3.addAiuto("E' vicino a Piazza Plebiscito");
		t3.addAiuto("Vedi vicino la Statua di Bronzo di Carlo III.");
		percorso.add(t3);
	}
	public boolean nextState(boolean ok){		
		long ora=System.currentTimeMillis();
		if (stato.num>0)			
			stato.tempo=ora-lastTappaStartTime;
		//	return (stato.tempo-percorso.get(stato.num-1).tempo);
		else 
			stato.tempo=ora-startTime;
		lastTappaStartTime=ora;

		if (ok)
		updatePunteggio(lastTappaStartTime);
		if (stato.num<percorso.size()-1)
		{						
			
			//nuova tappa
			stato=percorso.get((stato.num)+1);
			punteggioTappa=stato.punteggioBase;
			remTime=stato.tempoPar;
			aiutoDirezione=false;
			aiutoIndizio=true;
			//aiutoImmagine=false;
			aiutoDistanza=true;
			aiutoTime=false;
			scaduto=false;
			return false;
		}
		else
			return true;
	}	
	
	public long calcolaTempoTappa(){				
		return percorso.get(stato.num-1).tempo;
	}

	public long calcolaTempoParziale(){
		long ora=System.currentTimeMillis();
		if (stato.num>0)
			return (ora-lastTappaStartTime);			
		else 
			return (ora-startTime);
	}

	public long calcolaTempoCaccia(){
		return lastTappaStartTime-startTime;
		//return stato.tempo-startTime;
	}
		
	
	public void start() {
		startTime = System.currentTimeMillis();
		stato=percorso.get(0);
		punteggio=0;
		punteggioTappa=stato.punteggioBase;
		remTime=stato.tempoPar;
		aiutoDirezione=false;
		aiutoIndizio=true;
		aiutoDistanza=true;
		//aiutoImmagine=false;
		aiutoTime=false;
		scaduto=false;
	}
	
	public String getIndizio() {
	//	String s=new String();
	//	s=stato.aiuto;
	//	if (!aiutoIndizio){
	//		aiutoIndizio=true;
	//		punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
	//	}		
	//	return s;
	String s=new String();
		if (stato.aiuto.size()>0 && stato.indiceAiuto<stato.aiuto.size()){
			s=stato.aiuto.get(stato.indiceAiuto);
			stato.indiceAiuto++;
			punteggioTappa=punteggioTappa-stato.punteggioBase*0.2;
		}
		
			
			else
		{
			s="nessun altro indizio";
		}
		return s;
	}
	public void setPunteggio(double dist) {
		punteggioTappa=punteggioTappa+dist/10;
		return;
	}
	public void updatePunteggio(long tempo) {
		punteggio+=punteggioTappa;
		
		return;
	}
	
	public void salvaStato(Editor editor) {
		editor.putBoolean("resume", true);
		editor.putLong("startTime", startTime);
		editor.putLong("lastTappaStartTime",lastTappaStartTime);
		editor.putFloat("punteggio", (float) punteggio);
		editor.putFloat("punteggioTappa", (float) punteggioTappa);
		editor.putInt("numTappa", stato.num);
		editor.putInt("indiceAiutoTappa", stato.indiceAiuto);
		editor.putBoolean("aiutoDirezione", aiutoDirezione);
		editor.putBoolean("aiutoDistanza", aiutoDistanza);
		editor.putBoolean("aiutoIndizio", aiutoIndizio);
	
		editor.putBoolean("aiutoTime", aiutoTime);		
		return;
	}
	public boolean caricaStato(SharedPreferences infoStatoCaccia) {
		//considerare il caso in cui i valori non siano settati
		Boolean resume=infoStatoCaccia.getBoolean("resume", false);
		if (resume) {
			startTime=infoStatoCaccia.getLong("startTime", 0);
			lastTappaStartTime=infoStatoCaccia.getLong("lastTappaStartTime",0);
			punteggio=(double)infoStatoCaccia.getFloat("punteggio",0);
			punteggioTappa=(double)infoStatoCaccia.getFloat("punteggioTappa", 0);
			int n=infoStatoCaccia.getInt("numTappa", 0);
			stato=percorso.get(n);
			stato.indiceAiuto=infoStatoCaccia.getInt("indiceAiutoTappa", stato.indiceAiuto);
			primaPosizioneTrovata=true;
			aiutoDirezione=infoStatoCaccia.getBoolean("aiutoDirezione", false);
			aiutoDistanza=infoStatoCaccia.getBoolean("aiutoDistanza", false);
			aiutoIndizio=infoStatoCaccia.getBoolean("aiutoIndizio", false);
			aiutoTime=infoStatoCaccia.getBoolean("aiutoTime", false);
		}
		return resume;		
	}
	public double calcolaDistanza(Location location) {
		//calcola distanza da obiettivo
		double deltaLong=Math.abs(stato.lon-location.getLongitude());
		double deltaLat=Math.abs(stato.lat-location.getLatitude());
		double delta=(Math.sqrt(deltaLong*deltaLong+deltaLat*deltaLat));
		delta=delta*60*1852;		
		return Math.ceil(delta);
	}
	public String getDistanza(Location location) {
		String s=new String();
		s=""+calcolaDistanza(location);
		if (!aiutoDistanza){
			aiutoDistanza=true;
			if (aiutoDirezione)
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
			else
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
		}		
		return s;		
	}
	public String getDirezione(Location location) {
		String s=new String();
		s=""+calcolaDirezione(location);
		if (!aiutoDirezione){
			aiutoDirezione=true;
			if (aiutoDistanza)
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
			else
				punteggioTappa=punteggioTappa-stato.punteggioBase*0.25;
		}		
		return s;
	}
	private String calcolaDirezione(Location location) {
		//calcola direzione verso obiettivo
		double deltaLong=stato.lon-location.getLongitude();
		double deltaLat=stato.lat-location.getLatitude();
		int dir=(int) Math.ceil(Math.atan(deltaLong/deltaLat)*180/Math.PI);
		if (deltaLat>=0 && deltaLong<0)
			dir=360+dir;
		else if (deltaLat<0)
			dir=180+dir;
		return ""+dir;
	}
	

}
